import Check from './check';
import {layer} from '../layer';

class Validate {
  constructor(data, option) {
    this.data = data;
    this.option = option;
  }

  /**
   * 出错时自动弹出提示
   * @param msg
   */
  onError(msg) {
    layer.error(msg);
  }

  /**
   * 数据校验
   * @param data
   * @returns {Promise<any>}
   */
  check(data) {
    this.data = data || this.data;
    const rules = [], that = this;
    for (const key in this.option) {
      if (this.option.hasOwnProperty(key)) {
        const value = this.data[key];
        const thisRule = this.option[key];
        const label = thisRule.label;
        const _myRules = thisRule.rule.split(',');
        _myRules.forEach(function (rule) {
          rules.push({
            key,
            label,
            value,
            rule,
            _fun: thisRule.fun,
            reg: thisRule.reg,
            errMsg: thisRule.errMsg
          });
        });
      }
    }
    const len = rules.length;
    let success = true, i = 0, item, errMsg = '';
    while (success && i < len) {
      item = rules[i];
      switch (item.rule) {
        case 'notEmpty':
          if (item.value.length === 0) {
            onError(item.errMsg || `请输入${item.label}`);
          }
          break;
        case 'mobile':
          if (!Check.isChinaMobile(item.value)) {
            onError(item.errMsg || `${item.label}不是有效的手机号码`);
          }
          break;
        case 'int':
          if (!Check.isInt(item.value)) {
            onError(item.errMsg || `${item.label}仅允许输入整数`);
          }
          break;
        case 'safe':
          if (!Check.isSafe(item.value)) {
            onError(item.errMsg || `${item.label}禁止输入特殊符号`);
          }
          break;
        case 'noSymbol':
          if (!Check.isNotSymbol(item.value)) {
            onError(item.errMsg || `${item.label}只允许输入汉字、数字和字母`);
          }
          break;
        case 'chinese':
        case 'cn':
          if (!Check.isChinese(item.value)) {
            onError(item.errMsg || `${item.label}仅允许输入汉字`);
          }
          break;
        case 'account':
          if (!Check.isAccount(item.value)) {
            onError(item.errMsg || `${item.label}仅允许输入数字和字母和下划线`);
          }
          break;
        case 'natural':
          if (!Check.isNatural(item.value)) {
            onError(item.errMsg || `${item.label}仅允许输入大于0的整数`);
          }
          break;
        case 'custom':
          if (!item.reg.test(item.value)) {
            onError(item.errMsg || `${item.label}校验失败`);
          }
          break;
        case 'function':
          if (!item._fun(item.value)) {
            onError(item.errMsg || `${item.label}校验失败`);
          }
          break;
        default://其他 进行长度校验
          regular(item);
          break;
      }
      i++;
    }
    if (success) {
      return Promise.resolve(this.data);
    } else {
      return Promise.reject(errMsg);
    }

    function onError(msg) {
      success = false;
      errMsg = msg;
      that.onError(msg);
    }

    /**
     * 长度校验
     */
    function regular(item) {
      const minReg = /^min\[(\d+)\]/;
      const maxReg = /^max\[(\d+)\]/;
      const lenReg = /^len\[(\d+)-(\d+)\]/;
      const sameReg = /^same\[([a-zA-Z0-9_]+)\]/;
      let success = true;

      if (minReg.test(item.rule)) {
        (function () {
          const result = item.rule.match(minReg);
          const min = parseInt(result[1]);
          if (item.value.length < min) {
            onError(item.errMsg || `${item.label}不能低于${min}个字符`);
          }
        })();
      } else if (maxReg.test(item.rule)) {
        (function () {
          const result = item.rule.match(maxReg);
          const max = parseInt(result[1]);
          if (item.value.length > max) {
            onError(item.errMsg || `${item.label}不能超过${max}个字符`);
          }
        })();

      } else if (lenReg.test(item.rule)) {
        (function () {
          const result = item.rule.match(lenReg);
          const min = parseInt(result[1]);
          const max = parseInt(result[2]);
          success = item.value.length >= min && item.value.length <= max;
          if (!success) {
            onError(item.errMsg || `${item.label}长度不能小于${min}，也不能大于${max}`);
          }
        })();
      } else if (sameReg.test(item.rule)) {
        (function () {
          const result = item.rule.match(sameReg);
          success = that.data[result[1]] === item.value;
          if (!success) {
            onError(item.errMsg || `${item.label}输入不一致`);
          }
        })();
      } else {
        console.log('未定义的校验规则', item.rule);
      }
    }
  }
}

export default Validate;
